package singlequeue

import (
	"errors"
	"fmt"
	"os"
)

type SingleQueue struct {
	maxSize int    // 队列最大长度
	array   [5]int // 用数组模拟队列
	front   int    // 队列最头部（不包含第一个元素）
	rear    int    // 队列最尾部（包含最后一个元素）
}

// 往队列中加入内容
func (this *SingleQueue) AddQueue(val int) (err error) {
	if this.rear == this.maxSize-1 {
		err = errors.New("queue fulled")
		return
	}

	this.rear++ // 尾部指针往后移（因为加是加在队列的后面）
	this.array[this.rear] = val

	return
}

func (this *SingleQueue) GetQueue() (val int, err error) {
	if this.front == this.rear {
		err = errors.New("queue empty")
		return
	}

	this.front++ // 头部指针往后移（因为取是从头部开始取）
	val = this.array[this.front]

	return
}

func (this *SingleQueue) ShowQueue() {
	for i := this.front + 1; i <= this.rear; i++ {
		fmt.Printf("array[%d]=%d\t", i, this.array[i])
	}
	fmt.Println()
}

func TestSingleQueue() {
	singleQueue := &SingleQueue{
		maxSize: 5,
		front:   -1,
		rear:    -1,
	}

	var key string
	var val int
	for {
		fmt.Println("1.输入 add 表示添加数据到队列")
		fmt.Println("2.输入 get 表示从队列获取数据")
		fmt.Println("3.输入 show 表示显示队列")
		fmt.Println("4.输入 exit 表示退出")

		fmt.Scanln(&key)

		switch key {
		case "add":
			fmt.Println("输入你要入队的值")
			fmt.Scanln(&val)
			err := singleQueue.AddQueue(val)
			if err != nil {
				fmt.Println(err.Error())
			} else {
				fmt.Println("加入队列ok")
			}
		case "get":
			val, err := singleQueue.GetQueue()
			if err != nil {
				fmt.Println(err.Error())
			} else {
				fmt.Printf("取出的值是：%d\n", val)
			}
		case "show":
			singleQueue.ShowQueue()
		case "exit":
			os.Exit(0)
		}
	}
}
